#include <iostream>
#include <string>
#include <string_view>
#include <vector>
#include <algorithm>
#include <memory>
#include <cmath>

// 注意：GCC 13不完全支持C++23的显式对象参数（explicit object parameter）特性
// 本文件演示了显式对象参数的概念，但使用传统C++语法以兼容GCC 13
// 实际C++23标准中，可以使用 `this Self&& self` 作为第一个参数

namespace cpp23 {

// 定义一个简单的Person类来演示显式对象参数的概念
class Person {
private:
    std::string m_name;
    int m_age;

public:
    Person(std::string name, int age) : m_name(std::move(name)), m_age(age) {}

    // 传统方法（兼容GCC 13）
    void introduce() const {
        std::cout << "我是 " << m_name << "，今年 " << m_age << " 岁。\n";
    }

    // 注意：C++23中可以使用显式对象参数，语法为：
    // void introduce(this const Person& self) { ... }
    // 但GCC 13不支持，所以使用传统方法
};

// 链式字符串构建器（使用传统方法）
class StringBuilder {
private:
    std::string m_buffer;

public:
    StringBuilder() : m_buffer() {}

    StringBuilder& append(const std::string& text) {
        m_buffer += text;
        return *this;
    }

    StringBuilder& append(const char* text) {
        m_buffer += text;
        return *this;
    }

    StringBuilder& append_line() {
        m_buffer += "\n";
        return *this;
    }

    StringBuilder& append_line(const std::string& text) {
        m_buffer += text + "\n";
        return *this;
    }

    std::string build() const {
        return m_buffer;
    }
};

// 点结构
struct Point {
    double x, y;
    Point(double x_val, double y_val) : x(x_val), y(y_val) {}
};

// 计算两点间距离
double distance(const Point& p1, const Point& p2) {
    return std::sqrt((p2.x - p1.x) * (p2.x - p1.x) + 
                     (p2.y - p1.y) * (p2.y - p1.y));
}

// 注意：C++23中可以使用显式对象参数，语法为：
// double calculate_distance(this const Point& self, const Point& other) { ... }
// 这样可以让非成员函数看起来像成员方法：p1.calculate_distance(p2)

} // namespace cpp23

void demonstrate_explicit_object_parameter() {
    using namespace cpp23;
    
    std::cout << "C++23 显式对象参数演示\n";
    std::cout << "=========================\n\n";
    std::cout << "注意：GCC 13不完全支持显式对象参数特性\n";
    std::cout << "本演示展示了概念和语法，但使用传统C++实现\n\n";

    std::cout << "1. 基本使用:\n";
    Person person("张三", 30);
    person.introduce();
    std::cout << "\n";

    std::cout << "2. 链式接口:\n";
    StringBuilder builder;
    std::string result = builder.append("Hello, ")
                                .append("C++23!")
                                .append_line()
                                .append_line("显式对象参数使链式调用更清晰")
                                .build();
    std::cout << "   构建结果:\n" << result << "\n";

    std::cout << "3. 非成员方法扩展:\n";
    Point p1(0, 0);
    Point p2(3, 4);
    std::cout << "   常规距离函数: " << distance(p1, p2) << "\n";
    std::cout << "   注意：C++23中可以使用 p1.calculate_distance(p2) 的语法\n\n";

    std::cout << "显式对象参数的优势:\n";
    std::cout << "1. 允许精确控制this参数的类型和引用限定符\n";
    std::cout << "2. 简化模板和CRTP代码\n";
    std::cout << "3. 减少代码重复，特别是引用限定方法\n";
    std::cout << "4. 让非成员函数可以像成员方法一样调用\n";
    std::cout << "5. 支持更灵活的链式调用\n\n";
    
    std::cout << "当前限制:\n";
    std::cout << "- GCC 13不完全支持此特性，需要使用传统C++语法\n";
    std::cout << "- 建议使用GCC 14+或Clang 17+以获得完整支持\n";
}
